layui.config({
    base: 'static/js/'
}).extend({
    treeTable: 'treeTable/treeTable'
}).use(['layer', 'treeTable', 'form', 'jquery', 'tree'], function () {
    var $ = layui.jquery;
    var layer = layui.layer;
    var form = layui.form;
    var treeTable = layui.treeTable;
    var tree = layui.tree;
    
    //就绪
    layer.ready(function(){
        //给输入框添加改变事件
    	$("#addResourceForm input[name=resourceName]").on("input propertychange", autoResource);
    	
    	//扁形数据
    	var resourceFlatData;
    	//树形数据
    	var resourceTreeData;
    });
    
    //初始化树形表格
    var initTreeTable = treeTable.render({
        elem: '#resourceTable',
        cellMinWidth: 60, //全局定义所有常规单元格的最小宽度（默认：60）
        tree: {
            iconIndex: 1,  // 折叠图标显示在第几列
            arrowType: 'arrow2', // 折叠图标
            idName: 'resourceId',  // 自定义id字段的名称
            pidName: 'parentId',  // 自定义标识是否还有子节点的字段名称
            childName: 'children',
            haveChildName: 'haveChild',  // 自定义标识是否还有子节点的字段名称
        },
        cols: [
        	//{type:'numbers'} //序号
            {type: 'checkbox'} //复选框
            ,{field:'resourceName', title:'资源名', width: '280px'}
            ,{field:'resourceAbbr', title:'资源简称', width: '140px'}
            ,{field:'resourceUrl', title:'资源路径', width: '300px'}
            ,{field:'subsetName', title:'资源类型', templet: function(d){
                return d.subsetName == "menu" ? "菜单" : "按钮";
            }}
            ,{field:'resourceRank', title: '资源等级'}
            ,{field:'resourceNumber', title: '资源序号'}
            ,{field:'description', title:'资源描述'}
            ,{align: 'center', toolbar: '#resourceBar', title: '操作', width: '80px'}
        ],
        reqData: function(data, callback) { 
        	//异步获得数据
            $.get('system/resource/resources', function (res) {
            	//将数据赋值一份
            	let resbackup = res;
            	//将扁形数据转为树形数据
            	let treedData = toTreeData(res, 'resourceId', 'parentId', 'children', '0000000000000000');
                //渲染树形表格
            	callback(treedData);
            	//返回一个处理过后的新数组
            	let newData = resbackup.map(function(item) {
            		//改成layui所需要的格式
				    return {
				        "id":item.resourceId,
				        "title":item.resourceName,
				        "resourceAbbr":item.resourceAbbr,
				        "parentId":item.parentId,
				        "resourceUrl":item.resourceUrl,
				        "resourceRank":item.resourceRank,
				        "resourceNumber":item.resourceNumber,
				        "children":item.children,
				        "spread": (item.parentId == null ? true : false) //展开顶层资源
				    }
				});
				//将扁形数据存入全局范围
				resourceFlatData = newData;
				//将扁形数据转换为树形数据
            	let newTreedData = toTreeData(newData, 'id', 'parentId', 'children', null);
            	//将树形数据存入全局范围
            	resourceTreeData = newTreedData;
        	});
        },
        style: 'margin-top:0;' //设置表格样式
    });
    
    //判断用户是否拥有按钮权限
	/*$.ajax({
		//async: false,
		url: "system/power/userHasResourceBtn",
		type: "post",
		data: {resourceName: $("title").text()},
		success: function(result){
			$(".btnCont").children().each(function(){ // 遍历按钮元素
				for(let i in result) {
					if(result[i].indexOf($(this).attr("title")) != -1) {
						return true; // jquery $("...").each 提供的，相当于continue
	                }
		        }
				$(this).remove(); // 删除按钮
			});
			$(".btnCont").css("display", "block"); // 显示按钮容器
		}
	});*/
    
    //数据表格头部工具栏
    $(".resource-toolbar").click(function(){
    	//获取选中的数据
    	var checkData = initTreeTable.checkStatus(); // 已经修改了源码，不会拿到半选状态的复选框
    	//获取到点击按钮的标题
    	var btn = $(this).prop("title");
    	switch(btn){
        	case '添加':
        		//弹出新增模态框
        		initAddResourceModal();
        		break;
        	case '修改':
        		//选择的数据数量
        		if (checkData.length < 1) {
        			layer.alert('最少要选择一行');
        		} else if(checkData.length > 1){
        			layer.alert('最多只能选择一行');
        		} else {
        			//弹出修改模态框，传递当前选中的一行数据过去
        			initUpdateResourceModal(checkData[0]);
        		}
        		break;
        	case '删除':
        		//定义提示信息
    			var msg = checkData.length == 1 ? "确认删除吗？" : "该资源下包含有子资源，确认全部删除吗?";
        		var resourceIds = [];
        		for (let i in checkData) {
        			resourceIds.push(checkData[i].resourceId);
        		}
        		layer.confirm(msg, {icon: 3, title:'提示'}, function(index){
        			layer.close(index);
        			//调用删除方法，传递要删除的行的ID
        			removeResource(resourceIds);
        		});
        		break;
       };
    });
    
    //初始化新增模态框
    var initAddResourceModal = function(){
  	  //弹出一个页面层
  	  layer.open({
  		  type: 1 // 基本层类型0~4，1为页面层
  		  ,title: '添加资源' // 标题
  		  ,area: ['410px', '600px'] // 宽高 只写一个参数就是表示宽度，高度会自适应
  		  ,content: $("#addResourceModal") // 文本、html都行
  	      ,anim: 0 // 弹出动画
  		  ,resize: false // 是否允许拉伸
  		  ,end : function(){ // 弹出层销毁时的回调函数（不论何种方式，只要关闭了就执行）
  			  //清空表单
      		  $("#addResourceForm")[0].reset();
  		  }    
  	  });
    }
    
    //初始化修改模态框
    var initUpdateResourceModal = function(data){
  	  //弹出一个页面层
  	  layer.open({
  		  type: 1 // 基本层类型0~4，1为页面层
  		  ,title: '修改资源' // 标题
  		  ,area: ['400px', '500px'] // 宽高 只写一个参数就是表示宽度，高度会自适应
  		  ,content: $("#updateResourceModal") // 文本、html都行
  		  ,anim: 0 // 弹出动画
  		  ,resize: false // 是否允许拉伸
  		  ,end : function(){ // 弹出层销毁时的回调函数（不论何种方式，只要关闭了就执行）
  			  //清空表单
      		  $("#updateResourceForm")[0].reset();
  		  }    
  	  });
  	  //表单赋值
  	  form.val('updateResourceForm', {
  		  "resourceId": data.resourceId
  	      ,"resourceName": data.resourceName
  	      ,"resourceAbbr": data.resourceAbbr
  	      ,"subsetName": data.subsetName
  	      ,"resourceUrl": data.resourceUrl
  	      ,"resourceNumber": data.resourceNumber
          ,"description": data.description
  	  });
    }
    
    //选择父资源点击事件
    $("#searchParentResource").click(function(){
    	//拿到资源简称
		var resourceAbbr = $("#addResourceForm input[name=resourceAbbr]").val();
		//如果没有输入资源名
		if (resourceAbbr == "" || resourceAbbr == null) {
			layer.msg('请先输入资源名', {icon: 5}); 
			return;
		}
    	//弹出一个页面层
    	var resourceTreeLayer = layer.open({
    		type: 1 // 基本层类型0~4，1为页面层
    		,title: '选择父资源' // 标题
    		,area: ['280px', '370px'] // 宽高 只写一个参数就是表示宽度，高度会自适应
    		,content: $("#resourceTreeModeal") // 文本、html都行
    		,resize: false // 是否允许拉伸
    		,end : function(){}// 弹出层销毁时的回调函数（不论何种方式，只要关闭了就执行）
    	});
    	
    	//渲染树形表格
        tree.render({
            elem: '#resourceTree'
            ,data: resourceTreeData // 数据源
            ,onlyIconControl: true // 是否只能通过左侧的图标控制开合
            ,showLine: true // 书否显示连接线，不显示就是三角形
            ,click: function(obj){
            	//提示
            	layer.confirm('确认选择这个资源为父级吗?', {icon: 3, title:'提示'}, function(index){
            		//关闭当前提示框
            		layer.close(index);
            		//选择的对象
            		var resource = obj.data;
            		//给父资源名赋值
            		$("#addResourceForm input[name=parentName]").val(resource.title);
            		//给父资源ID赋值
            		$("#addResourceForm input[name=parentId]").val(resource.id);
            		//拿到父资源对象
            		var parentResource = findResourceById(resource.id);
            		//生成资源路径
            		$("#addResourceForm input[name=resourceUrl]").val("views/" + resourceAbbr + ".html");
            		/* 自动生成资源路径，等级，序号 */
            		/*
            		//判断有没有父id，没有说明是最上层的
            		if (typeof(parentResource.parentId) == "undefined" || parentResource.parentId == null) {
            			$("#addResourceForm input[name=resourceUrl]").val("views/" + resourceAbbr);
            		} else {
            			//定义当前资源路径
            			var resourceUrl;
            			//如果父资源路径为空，说明我们选择的父资源是一级资源
            			if (parentResource.resourceUrl == null) {
            				resourceUrl = "views/" + parentResource.resourceAbbr + "/" + resourceAbbr; //资源简称在上面拿到的
            			} else {
            				resourceUrl = parentResource.resourceUrl + "/" + resourceAbbr;
            			}
            			//赋值
            			$("#addResourceForm input[name=resourceUrl]").val(resourceUrl);
            			$("#addResourceForm input[name=resourceUrlBackup]").val(resourceUrl);
            		}*/
            		
            		/* 自动生成资源等级 */
            		var resourceRank = parseInt(parentResource.resourceRank) + 1;
            		$("#addResourceForm input[name=resourceRank]").val(resourceRank);
            		
            		/* 自动生成资源序号 */
            		//拿到父资源的所有子资源对象
            		var resourceArray = findResourceByRank(resourceRank);
            		//定义一个最大数字
            		var max = 0;
            		for (let i in resourceArray) {
            			//赋值
            			max = resourceArray[i].resourceNumber > max ? resourceArray[i].resourceNumber : max;
            		}
            		$("#addResourceForm input[name=resourceNumber]").val(max + 1)
            		
            		//关闭资源树弹出框
            		layer.close(resourceTreeLayer);
        		});
            }
        });
    });
    
    //添加表单发送请求
    form.on('submit(addResourceBtn)', function(data){
    	$.ajax({
    		async: false,
    		url:"system/resource/resource",
    		type: "post",
    		data: data.field,
    		dataType: "json",
    		success:function(result){
    			//刷新数据表格
    			initTreeTable.refresh(); //异步
    			if (result) {
    				//关闭所有弹框
    				layer.closeAll();
    				//提示信息
    				layer.msg("添加成功！", {icon: 1, time: 2500}); 
    			} else {
    				layer.msg("添加失败！", {icon: 2, time: 2500}); 
    			}
            }, error:function(){
            	alert("你返回失败了")
            }
    	});
    	return false; //阻止表单跳转。
    });
    
    //修改表单发送请求
    form.on('submit(updateResourceBtn)', function(data){
    	$.ajax({
    		async: false,
    		url:"system/resource/resource",
    		type: "post",
    		data: data.field,
    		dataType: "json",
    		success:function(result){
    			//刷新数据表格
    			initTreeTable.refresh(); //异步
    			if (result) {
    				//关闭所有弹框
    				layer.closeAll();
    				//提示信息
    				layer.msg("修改成功！", {icon: 1, time: 2500}); 
    			} else {
    				layer.msg("修改失败！", {icon: 2, time: 2500}); 
    			}
            }, error:function(){
            	alert("你返回失败了")
            }
    	});
    	return false; //阻止表单跳转。
    });
    
    //监听工具条点击事件
    treeTable.on('tool(resourceTable)', function(obj){
    	//获取当前行的数据
    	var data = obj.data;
        switch (obj.event) {// 获得lay-event对应的值
		case "update":
			//弹出修改模态框，传递当前选中的一行数据过去
			initUpdateResourceModal(data); // 获得当前行数据
			break;
		}
    });
    
    //删除资源
    var removeResource = function(resourceIds){
    	//发送异步请求冻结或还原资源
        $.ajax({
        	async: false, //默认为true，false表示同步，如果当前请求没有返回则不执行后续代码
        	type: "post", 
        	url:'system/resource/resource',
        	data : {
        		resourceIds: resourceIds,
        		_method: "delete"
        	},
        	traditional: true, // 序列化参数，数组才能直接接收
        	datatype : 'json',
        	success:function(result) {
        		//刷新数据表格
        		initTreeTable.refresh(); //异步
        		if (result) {
        			layer.msg("删除成功！", {icon: 1, time: 2500});   
        		} else {
        			layer.msg("删除失败！", {icon: 2, time: 2500}); 
        		}
        	}, error:function(){
            	alert("你返回失败了")
            }
        });
    }
    
    //头部搜素表单提交
    form.on('submit(resourceSearchBtn)', function(data){
    	//获取表单的数据
    	var data = data.field;
    	// 根据关键字模糊搜索
  	    initTreeTable.filterData(data.keyword);
  	    return false; //阻止表单跳转。
    });
    
    //关闭模态框 新增和修改模态框共用这个点击事件
    $(".modalClose").click(function(){
    	//关闭页面上所有类型的所有弹框
    	layer.closeAll();
    });
    
    //头部搜索表单的重置按钮
    $("#searchReset").click(function(){
    	//重置表格
    	initTreeTable.reload();
    });
    
    //展开按钮
    $("#unfoldAll").click(function(){
    	//重置表格
    	initTreeTable.expandAll();
    });
    
    //折叠按钮
    $("#foldAll").click(function(){
    	//重置表格
    	initTreeTable.foldAll();
    });
});


/*
 * 自动生成资源某些参数
 */
function autoResource() {
	//资源名
	var resourceName = $(this).val();
	//资源简称对象
	var resourceAbbr = $("#addResourceForm input[name=resourceAbbr]");
	//利用汉字转拼音js脚本赋值
	resourceAbbr.val(Pinyin.GetJP(resourceName));
	/*//资源路径对象
	var resourceUrl =$("#addResourceForm input[name=resourceUrl]");
	//资源路径备份对象的值
	var resourceUrlBackup =$("#addResourceForm #resourceUrlBackup").val();
	//资源路径值
	var resourceUrlVal = resourceUrl.val();
	if (resourceUrlVal != "" && resourceUrlVal != null) {
		var newResourceUrlVal = resourceUrlBackup.substring(0, resourceUrlBackup.lastIndexOf("/") + 1);
		resourceUrl.val(newResourceUrlVal + resourceAbbr.val());
	}*/
}

/*
 * 根据资源ID查找资源
 */
function findResourceById(_id){
	let resource = resourceFlatData;
	for(let i in resource) {
		if (resource[i].id == _id) {
			return resource[i];
		}
	}
}

/*
 * 根据资源等级查找资源
 */
function findResourceByRank(_rank){
	let resource = resourceFlatData;
	let resourceArray = new Array();
	for(let i in resource) {
		if (resource[i].resourceRank == _rank) {
			resourceArray.push(resource[i]);
		}
	}
	return resourceArray;
}

/* 
	扁形数据转为树形数据
	source：要转换的数据源
	idName: id的字段名
	parentIdName: 父id的字段名
	children: 子元素集合字段名
	parentId: 要显示数据的顶层id
*/
function toTreeData(source, idName, parentIdName, childrenName, parentId){   
    let cloneData = JSON.parse(JSON.stringify(source));
    return cloneData.filter(father => {
        let branchArr = cloneData.filter(child => father[idName] == child[parentIdName]);
        branchArr.length > 0 ? father[childrenName] = branchArr : '';
        return father[parentIdName] == parentId;
    });
}
